package com.jsg.sl651.constant;

import com.jsg.sl651.entity.frame.header.Function;
import com.jsg.sl651.enums.DefinitionType;
import com.jsg.sl651.enums.FunctionCode;

import java.util.HashMap;
import java.util.Map;

/**
 * function code identifier
 */
public final class FunctionCodeIdentifier {

    private final static Map<Integer, Function> FUNCTION_MAP = new HashMap<>();

    static {
        // 注册所有文档要求的功能编码
        for (FunctionCode value : FunctionCode.values()) {
            FUNCTION_MAP.put(value.getCode(), new Function(value.getCode(), value.getName(), value.getDesc(), DefinitionType.DOCUMENT_DEFINITION,value));
        }
    }

    /**
     * 注册自定义的功能编码。
     *
     * <p>方法核心</p>
     * <ul>
     *     <li>检查指定的功能编码是否已经存在于映射表中。</li>
     *     <li>如果功能编码已经存在且是 SL651 协议规定的（即 {@link DefinitionType#DOCUMENT_DEFINITION}），则抛出 IllegalArgumentException。</li>
     *     <li>如果功能编码不存在或不是 SL651 协议规定的，则注册新的功能编码。</li>
     * </ul>
     *
     * @param code 功能编码，整数类型
     * @param name 功能名称
     * @param desc 功能描述
     * @throws IllegalArgumentException 如果功能编码已经存在且是 SL651 协议规定的
     */
    public static synchronized void register(final int code, final String name, final String desc) {
        Function function = FUNCTION_MAP.get(code);
        if (function != null && function.getDefinitionType().equals(DefinitionType.DOCUMENT_DEFINITION)) {
            throw new IllegalArgumentException("功能编码[" + code + "]已经存在,并且它是SL651协议规定的,无法被替换更改");
        }
        FUNCTION_MAP.put(code, new Function(code, name, desc, DefinitionType.CUSTOMIZE,null));
    }



    public static Function getFunction(final int code) {
        Function function = FUNCTION_MAP.get(code);
        if (function == null) {
            throw new IllegalArgumentException("功能编码[" + code + "]不存在");
        }
        return function;
    }

}
